<?php 	
	require_once('paths.inc');
	require_once(INCLUDE_PATH.'constants.inc');
	require_once('page.inc');
	require_once(DB_PATH.'db.inc');
	
    require_once('security.inc');
	require_once('server_validations.inc');
	require_once('utils.inc');	
	require_once('utilsPlati.inc');		
	
	session_start();

	check_permissions(CT_PERM_PLATI);
	//get a db connection handler
	$db = db_connect();
    select_language();
	
	if (isset($_POST['add_plata'])) {
        
		$moneda = $_POST['moneda'];
		$suma = prepareNumberForServer($_POST['suma']);
		$data = getDateForServer($_POST['data_plata']);
		
		//hidden fileds
		$sumaTotala = $_POST['suma_total_comanda'];
		
		$tipPlata = $_POST['tip_plata'];
		$idComanda = $_POST['id_comanda'];
		$sumaPlataPartiala = $_POST['val_plata_partiala'];
		$stareKind = $_POST['stare_kind'];
		if (isset($_POST['idPlata']))
            $idPlata = $_POST['idPlata'];
        if (isset($_POST['plataVersion']))
		    $plataVersion = $_POST['plataVersion'];
		$sumaRestPlata = $_POST['suma_rest_plata'];
        $action = $_GET['action'];
		//end hidden fileds
		
		/****************************** SERVER VALIDATIONS ******************************/
		$errorMess = "";
		
		if (filter_var($suma, FILTER_VALIDATE_FLOAT) === FALSE)
			$errorMess .= "1. " . 'LANG_Error_suma_not_a_numbar';
		else {
			if ($suma < 0)		
				$errorMess .= 'LANG_Error_suma_negativa';		
			if ($suma == 0.0) 
				$errorMess .= 'LANG_Suma_este_zero';
				
			//check if suma is greater than the maximum available and act accordingly
			if ($suma > $sumaRestPlata) {
				$errorMess .= 'LANG_Suma_over_maxim_posibil';
            }
		}
        if (!checkServerDate($data))
            $errorMess .= 'LANG_Data_incorecta';
        
        
		if ($errorMess != "") {
			if (isset($idPlata))
				error_msg($errorMess, "add_plata.php?tip=" . $tipPlata . "&idPlata=" . $idPlata);
			if (isset($idComanda))				
				error_msg($errorMess, "add_plata.php?tip=" . $tipPlata . "&id_comanda=" . $idComanda);
		}				
		/****************************** END SERVER VALIDATIONS ******************************/        
		else {
			//creeam obiectul plata
			$plata = new PlatiComanda($idComanda, $_SESSION['user_logat']->id_user, $tipPlata, $moneda, $suma, $data);
			//inseram plata
			try {
				$db->beginTransaction();
				
				if (isset($idPlata)) {
					$plata->id_platicomanda = $idPlata;
					$plata->version = $plataVersion;
                    $plata->queryUpdate($db);
				}
				else
					$plata->queryInsert($db);
                //$comanda = new LightComanda();
				$comanda = LightComanda::queryLightLoadByID($db, $idComanda, $_SESSION['client_logat']->id_client, $moneda);
				//verificam daca trebuie sa schimbam statusul comenzii: ramane partiala sau completa
				if ($suma + $sumaPlataPartiala < $sumaTotala) {
                    $comanda->updateStare($db, $stareKind, 1, $idComanda);
					
					if ($tipPlata == CT_PLATA_PLATA) {
						$messageToTheUser = 'LANG_Plata_Partiala_Ramane_Partial';
					}
					else
						$messageToTheUser = 'LANG_Incasare_Partiala_Ramane_Partial';
				}
				if ($suma + $sumaPlataPartiala > $sumaTotala) {
					//eroare in logica programului.
				}
				if ($suma + $sumaPlataPartiala == $sumaTotala) {
					//aici trebuie sa schimbam statusul comenzii din platita partial in plata completa
					//efectiv schimbam unul din cele 2 campuri: stare_incasare_sol, stare_plata_exec
					$comanda->updateStare($db, $stareKind, 2, $idComanda);
					if ($tipPlata == CT_PLATA_PLATA)
						$messageToTheUser = 'LANG_Plata_Acopera_Integral';
					else
						$messageToTheUser = 'LANG_Incasare_Acopera_Integral';
				}
                
				$db->commit();
                if ($action == 'pac')
				    notice_msg($messageToTheUser, "add_plata.php?tip=1&id_comanda=" . $idComanda);
                else 
                    notice_msg($messageToTheUser, "show_comenzi.php");
			}
			catch (QueryInsertPlatiComandaException $e) {
				$db->rollBack();		//maybe NOT needed ????
	        	redirectOnError(CT_ADD_PLATA_INSERT_PLATI_COMANDA);
			}
			catch (QueryUpdateStareException $e) {
				$db->rollBack();		//maybe NOT needed ????        	
	        	redirectOnError(CT_ADD_PLATA_COMANDA_UPDATE_STARE);
			}
			catch (QueryUpdatePlatiComandaException $e) {
                $db->rollBack();        //maybe NOT needed ????
			    redirectOnError(CT_ADD_PLATA_UPDATE_PLATI_COMANDA);
			}
            catch (QueryWrongVersionException $e) {                
                $db->rollBack();        //maybe NOT needed ????
                notice_msg(LANG_Datele_pe_care_lucrati_au_fost_modificate, "add_plata.php");
            }
			//end inserare plata		
		}
	}
	else {
		$tipPlata = $_GET['tip'];
		if (isset($_GET['id_comanda']))
            $idComanda = $_GET['id_comanda'];
        
		//daca este not null avem de a face cu o editare de plata
		if (isset($_GET['idPlata']))
            $idPlata = $_GET['idPlata'];
            
        if (isset($_GET['action']))
            $action = $_GET['action'];

		$messageToTheUser = "";
	
		if ($tipPlata == 1) {
			if (isset($idPlata)) {
				$titlu = "LANG_Pagina_Editare_Plata";
                $help_text = LANG_EXTRA_EDIT_PLATA;
            }
			else {
				$titlu = "LANG_Pagina_Adauga_Plata";
                $help_text = LANG_EXTRA_ADD_PLATA;
            }
		}
		else {
			if (isset($idPlata)) {
				$titlu = "LANG_Pagina_Editare_Incasare";
                $help_text = LANG_EXTRA_EDIT_INCASARE;
            }
			else {
				$titlu = "LANG_Pagina_Adauga_Incasare";
                $help_text = LANG_EXTRA_ADD_INCASARE;
            }
		}
		
		html_header($titlu, "calendar", "add_plata");
		select_js_language();
        
        ?>
		
		<script type="text/javascript">
		
			function validateForm() {								
				return validateFloat(prepareNumberForServer(document.form_add_plata.suma.value), '<?php echo LANG_SUMA; ?>', true);
			}
		
		</script>
		
		<?php
		
		//verificam daca comanda e platita partial sau nu
		$tipPlata == CT_PLATA_PLATA ? $stareKind = "stare_plata_exec" : $stareKind = "stare_incasare_sol";
		$stareKind == "stare_plata_exec" ? $sumaKind 	= "suma_totala_exec" 	: $sumaKind 	= "suma_totala_sol";		
		$stareKind == "stare_plata_exec" ? $nrComanda 	= "nr_comanda_exec" 	: $nrComanda 	= "nr_comanda_sol";	
		$stareKind == "stare_plata_exec" ? 	$moneda 	= "moneda_exec" 	 	: $moneda 		= "moneda_sol";	
		
		if (!isset($idComanda)) {
			if ($tipPlata == 1)	{		
				$linkuri = array(LANG_Home => "home.php", LANG_Plati => "view_plata.php", LANG_Edit_plata => "");
			}
			else $linkuri = array(LANG_Home => "home.php", LANG_Incasari => "view_incasare.php", LANG_Add_Incasare => "");
		}
		else {
			if ($tipPlata == 1) {
				$linkuri = array(LANG_Home => "home.php", LANG_Plati => "view_plata.php", LANG_Add_plata => "");
			}
			else $linkuri = array(LANG_Home => "home.php", LANG_Incasari => "view_incasare.php", LANG_Add_Incasare => "");
		}
		titlu_pagina($linkuri);		
		
		output_error_msg();
        output_notice_msg();
        output_extra_text($help_text);
		
		if (isset($idPlata))
			$idComanda = PlatiComanda::getComandaID($db, $idPlata, $_SESSION['user_logat']->id_client);
		
		try {
			$statusAndSuma = array();
			$statusAndSuma = Comanda::getStatusAndSumaKind($db, $idComanda, $stareKind, $sumaKind, $nrComanda, $moneda);									
			
			//setam valoarea platii partiale
			$valoarePlataPartiala = 0;
            $valoarePlataPartiala = PlatiComanda::getPlataStatusForComanda($db, $idComanda, $tipPlata, $_SESSION['user_logat']->id_client);
                
			if ($valoarePlataPartiala == 0) {
				if ($tipPlata == CT_PLATA_PLATA) {
					render_status_comanda_table($statusAndSuma[$nrComanda], LANG_NOT_PAID, 0.0, $statusAndSuma[$sumaKind], $statusAndSuma[$sumaKind]);
				}
				else 
					render_status_comanda_table($statusAndSuma[$nrComanda], LANG_NOT_INCASATA, 0.0, $statusAndSuma[$sumaKind], $statusAndSuma[$sumaKind]);
			}
			else {			
				//daca avem de a face cu o comanda care este platita partial
				
				//facem un calcul sa vedem cat mai are de platit si cat este deja platit
				//pe baza tipului comenzii stabilim tipul platii pe baza caruia vom facem cautarea		
					
				if ($valoarePlataPartiala == NULL)
					$valoarePlataPartiala = 0;
					
				//end calcul
				if ($valoarePlataPartiala < $statusAndSuma[$sumaKind]) {
					if ($tipPlata == CT_PLATA_PLATA)
						render_status_comanda_table($statusAndSuma[$nrComanda], LANG_PLATITA_PARTIAL, $valoarePlataPartiala, ($statusAndSuma[$sumaKind] - $valoarePlataPartiala), $statusAndSuma[$sumaKind], $currencies[$statusAndSuma[$moneda]]);
					else 
						render_status_comanda_table($statusAndSuma[$nrComanda], LANG_INCASATA_PARTIAL, $valoarePlataPartiala, ($statusAndSuma[$sumaKind] - $valoarePlataPartiala), $statusAndSuma[$sumaKind], $currencies[$statusAndSuma[$moneda]]);
				}
				else {
					if ($tipPlata == CT_PLATA_PLATA)
						render_status_comanda_table($statusAndSuma[$nrComanda], LANG_PLATITA_TOTAL, $statusAndSuma[$sumaKind], 0, $statusAndSuma[$sumaKind], $currencies[$statusAndSuma[$moneda]]);
					else 
						render_status_comanda_table($statusAndSuma[$nrComanda], LANG_INCASATA_TOTAL, $valoarePlataPartiala, 0, $statusAndSuma[$sumaKind], $currencies[$statusAndSuma[$moneda]]);					
				}				
			}
		}
		catch (QueryGetStatusComandaException $e) {					
			redirectOnError(CT_ADD_PLATA_GET_STATUS_COMANDA);
		}
		catch (getPlataStatusForComandaException $e) {
			redirectOnError(CT_ADD_PLATA_PLATA_STATUS_FOR_COMANDA);
		}
        catch (getPlataStatusForComandaInvalidIDException $e) {
            redirectOnError(CT_INVALID_COMANDA_ID_IN_ADD_PLATA);
        }
		//end verificam daca comanda e platita partial sau nu
		
		//nu lasam sa isi faca de cap pe o comanda platita integral doar daca vrea sa o editeze
		if ($statusAndSuma[$stareKind] != 2 || isset($idPlata)) {
			//for ($i = 0; $i < count($currencies); $i++)
			//	$monedaValues[] = $i;
							
			if (isset($idPlata)) {
				try {
					$plataForEdit = PlatiComanda::queryLoadById($db, $idPlata, $_SESSION['user_logat']->id_client);
				}
				catch (QueryLoadPlatiComandaException $e) {
                    redirectOnError(CT_ADD_PLATA_LOAD_PLATI_COMANDA);
				}
			}
			
            $formAction = '';
            if (isset($action) && ($action == 'pac'))
                $formAction = '?action=pac';

			echo '<div align="left" class="container">';
			echo '<form name="form_add_plata" id="form_add_plata" action="add_plata.php' . $formAction . '" method="post" onsubmit="return (validateForm());">';
			echo '<table id="wrapper" align="left">';
				echo '<thead>';
					echo '<tr>';
						echo '<th colspan="6" align="center">';
							if ($tipPlata == 1)
								echo LANG_PLATA_NOUA;
							else 
								echo LANG_INCASARE_NOUA;
						echo '</th>';
					echo '<tr>';
				echo '</thead>';
				
				echo '<tr class="capTabel">';
					echo '<td>' . LANG_SUMA . '</td>';
					echo '<td>';
						if (isset($idPlata))
							echo '<input type="text" name="suma" maxlenth="6" size="5" value="' . prepareFloatForUser($plataForEdit->suma) . '" /> ';
						else
							echo '<input type="text" name="suma" maxlenth="6" size="5" value="' . prepareFloatForUser($statusAndSuma[$sumaKind] - $valoarePlataPartiala) . '" /> ';
                        
                        echo $currencies[$statusAndSuma[$moneda]];
					echo '</td>';
					?>
					<td><?php echo LANG_DATA; ?></td>
					<td><?php 
                        if (isset($idPlata)) {
                            if (checkServerDate($plataForEdit->data))
                                $data = $plataForEdit->data;
                            else
                                $data = "";
                        }
                        else
                            $data = date("Y-m-d");
                        echo render_date_field_button($data, 'data_plata', 'main', null, null, null, null, null, false, false);?>
					</td>
					<?php
					//am pus aceste campuri cu hidden ca sa transmit informatia cand se face post si sa nu o mai calculez odata
					//pe baza ei imi dau seama daca la comanda respectiva ii schimb statul:
					//adica daca ramane in continuare platita partial sau cu plata aceasta comanda devine platita integral
					echo '<input type="hidden" value="' . $statusAndSuma[$sumaKind] . '" name="suma_total_comanda" />';					
					echo '<input type="hidden" value="' . $tipPlata . '" name="tip_plata" />';					
					echo '<input type="hidden" value="' . $idComanda . '" name="id_comanda" />';
					if (isset($plataForEdit))
						echo '<input type="hidden" value="' . ($valoarePlataPartiala - $plataForEdit->suma). '" name="val_plata_partiala" />';					
                    else
                        echo '<input type="hidden" value="' . ($valoarePlataPartiala). '" name="val_plata_partiala" />';                    
					echo '<input type="hidden" value="' . $stareKind . '" name="stare_kind" />';
					if (isset($plataForEdit))
						echo '<input type="hidden" value="' . ($statusAndSuma[$sumaKind] - $valoarePlataPartiala + $plataForEdit->suma) . '" name="suma_rest_plata" />';
                    else
                        echo '<input type="hidden" value="' . ($statusAndSuma[$sumaKind] - $valoarePlataPartiala) . '" name="suma_rest_plata" />';
					echo '<input type="hidden" value="' . $statusAndSuma[$moneda] . '" name="moneda" />';											
					if (isset($idPlata)) {
						echo '<input type="hidden" value="' . $idPlata . '" name="idPlata" />';					
						echo '<input type="hidden" value="' . $plataForEdit->version . '" name="plataVersion" />';											
					}
				echo '</tr>';
			echo '</table>';
			echo '</div>';
			
			if ($tipPlata == 1) {
				if (isset($idPlata)) 
					$titluButon = LANG_Editare_Plata;
				else 
					$titluButon = LANG_Add_plata;
				}
			else {
				if (isset($idPlata)) 
					$titluButon = LANG_Editare_Incasare;
				else 
                    if (isset($action) && ($action == 'pac'))
                        $titluButon = LANG_Incaseaza_Apoi_Plateste;
                    else
					    $titluButon = LANG_Add_Incasare;
			}
		
			echo '<div class="container">';
			buton_final_ok($titluButon, "add_plata");
			echo '&nbsp;&nbsp;';
			buton_final_cancel(LANG_CANCEL, "show_comenzi.php");
			echo '</form>';
			echo '</div>';			
		}
	}
	html_footer();
?>